package cn.lxh.system.controller;


import cn.lxh.system.domain.Course;
import cn.lxh.system.query.CourseQuery;
import cn.lxh.system.service.ICourseService;
import cn.lxh.util.ExcelUtil;
import cn.lxh.util.JsonResult;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * CourseController控制器类
 */
@RestController // 该类交给spring管理, 并且返回JSON格式
@RequestMapping("/course") // 默认请求路径
@Api(tags = "课程接口类")
public class CourseController {

    @Autowired
    private ICourseService courseService;

    /**
     * 根据id判断是添加还是修改
     *
     * @param course
     * @return
     */
    @PutMapping
    @ApiOperation("根据id判断是添加还是修改")
    public JsonResult addOrUpdate(@RequestBody Course course) { // 将前端JSON格式的数据转为Java对象
        try {
            if (course.getId() == null) {
                // 添加课程
                courseService.add(course);
            } else {
                // 修改课程
                courseService.update(course);
            }
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常信息
            return JsonResult.error(); // 失败
        }
    }

    /**
     * 根据id删除课程
     *
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    @ApiOperation("根据id删除课程")
    public JsonResult delete(@PathVariable("id") Long id) {
        try {
            // 根据id删除课程
            courseService.delete(id);
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常信息
            return JsonResult.error(); // 失败
        }
    }

    /**
     * 根据id查询单个课程
     *
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @ApiOperation("根据id查询单个课程")
    public Course findOne(@PathVariable("id") Long id) {
        return courseService.findOne(id);
    }

    /**
     * 查询所有课程
     *
     * @return
     */
    @GetMapping
    @ApiOperation("查询所有课程")
    public List<Course> findAll() {
        return courseService.findAll();
    }

    /**
     * 根据id批量删除课程
     *
     * @param ids
     * @return
     */
    @PatchMapping
    @ApiOperation("根据id批量删除课程")
    public JsonResult patchDelete(@RequestBody Long[] ids) {
        try {
            // 根据id批量删除课程
            System.out.println(ids);
            courseService.patchDelete(ids);
            return JsonResult.success(); // 成功
        } catch (Exception e) {
            e.printStackTrace(); // 打印异常信息
            return JsonResult.error(); // 失败
        }
    }

    /**
     * 分页查询
     *
     * @param courseQuery
     * @return
     */
    @PostMapping
    @ApiOperation("分页查询")
    public PageInfo<Course> queryPage(@RequestBody CourseQuery courseQuery) {
        return courseService.queryPage(courseQuery);
    }
    
    
    // Excel导出 (与文件下载类似, 形参列表都需要HttpServletResponse, 后端查询的数据保存到内存, 再把数据生成Excel表格导出)
    @GetMapping("/exportExcel")
    public void export(HttpServletResponse response) {
        // 查询所有的课程
        List<Course> list = courseService.findAll();
        try {
            // Excel导出 (调用ExcelUtil工具类)
            ExcelUtil.exportExcel(list, "课程信息表", "课程列表", Course.class, "Course", response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // Excel导入 (与文件上传类似, 形参列表都需要MultipartFile, 把前端上传的文件封装成MultipartFile对象, 根据对象获取输入流读取到内存, 再对内存的数据进行操作, 如批量添加数据到数据库)
    @PostMapping("/importExcel")
    public JsonResult importExcel(MultipartFile excelFile) {
        try {
            // Excel导入
            List<Course> list = ExcelUtil.importExcel(excelFile, 1, 1, Course.class);
            System.out.println(list);
            // 批量添加课程
            courseService.batchSave(list);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JsonResult.success("导入成功");
    }

}
